#include <iostream>
#include <cassert>
#include <signal.h>
#include <unistd.h>
using namespace std;

void catchSig(int signum)
{
    cout << "[捕获到" << signum << "号信号]" << endl;
}

void showPending(sigset_t& pending)
{
    for(int i = 1; i <= 31;i++)
    {
        if(sigismember(&pending, i))
        {
            cout << "1";
        }else
        {
            cout << "0";
        }
    }
    cout << endl;
}

//阻塞信号
void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset,sig);
    int n = sigprocmask(SIG_BLOCK,&bset,nullptr);
    assert(n == 0);
    (void)n;
}

int main()
{
    for(int i = 0;i <= 31;i++)
    {
        blockSig(i);
    }
    sigset_t pending;
    
    while(true)
    {
        sigpending(&pending);
        showPending(pending);
        sleep(1);
    }
}

//捕获一个信号
// int main()
// {
//     //先设置个可捕获2号信号做测试
//     signal(2,catchSig);
//     //1.创建信号集,前两个是阻塞信号集的now和old,后边用于存储未决信号集
//     sigset_t blockset,oldbset;
//     sigset_t pending;
//     //2.初始化信号集
//     sigemptyset(&blockset);
//     sigemptyset(&oldbset);
//     sigemptyset(&pending);
//     //3.修改阻塞信号集
//     sigaddset(&blockset,2);
//     //4.设置到进程集中
//     int n = sigprocmask(SIG_BLOCK,&blockset,&oldbset);
//     assert(n==0);
//     //因为在release状态下assert被省略，n需要被使用一下，否则会报警说n未使用
//     (void)n;
//     cout << "阻塞2号进程成功" << endl;

//     //5.重复打印一下pending集，确保2号信号其实是收到的，只是被阻塞了而已
//     while(1)
//     {
//         sigpending(&pending);
//         showPending(pending);
//         sleep(1);
//     }
//     return 0;
// }